// 继承:类与类之间的关系
// 继承后类与类之间的叫法
// A类继承了B这个类,那么此时A类叫子类,B类叫基类
// 子类 ---->派生类
// 基类 ----> 超类(父类)
// 一旦发生了继承关系,就出现了父子类的关系
var __extends = (this && this.__extends) || (function () {
    var extendStatics = function (d, b) {
        extendStatics = Object.setPrototypeOf ||
            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
            function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };
        return extendStatics(d, b);
    };
    return function (d, b) {
        if (typeof b !== "function" && b !== null)
            throw new TypeError("Class extends value " + String(b) + " is not a constructor or null");
        extendStatics(d, b);
        function __() { this.constructor = d; }
        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
    };
})();
;
(function () {
    // 定义一个类
    var Person = /** @class */ (function () {
        function Person(name, age, gender) {
            this.name = name;
            this.age = age;
            this.gender = gender;
        }
        Person.prototype.sayHi = function () {
            console.log(this.name);
        };
        return Person;
    }());
    // 定义一个类,继承自Person
    var Student = /** @class */ (function (_super) {
        __extends(Student, _super);
        function Student(name, age, gender) {
            // 调用的是父类中的构造函数,使用的是super
            return _super.call(this, name, age, gender) || this;
        }
        Student.prototype.sayHi = function () {
            console.log('子类');
            _super.prototype.sayHi.call(this);
        };
        return Student;
    }(Person));
    // 实例化Person
    var person = new Person('2', 2, '2');
    var stu = new Student('1', 1, '1');
    console.log(person, stu);
    stu.sayHi();
    // 总结:类和类之间如果要有继承关系,需要使用extends关键字
    // 子类中可以调用父类中的构造函数,使用的是super关键字(包括调用父类中的实例方法，也可以使用super)
    // 子类可以重写父类中的方法
})();
